/**
 *	@file	pgear_sv_util.h
 *	@brief	ポケギアセーブデータ　ユーティリティ
 *	@author	Mikyuki Iwasawa
 *	@date	07.08.03
 */

#ifndef __H_PGEAR_SV_UTIL_H__
#define __H_PGEAR_SV_UTIL_H__

//定数定義
#include "savedata/pgear_sv_def.h"
#include "savedata/marker_util.h"
#include "tel/pmtel_number.h"
#include "tel/pmtel_reserve_def.h"
#include "savedata/savedata_def.h"


//------------------------------------------------------------
/**
 * @brief ポケギアセーブデータブロック管理構造への不完全型ポインタ
 *
 * 中身は見えないけどポインタ経由で参照はできる
 */
//------------------------------------------------------------
typedef struct _PGEAR_SAVE PGEAR_SAVE;
typedef struct _PMTEL_SAVE PMTEL_SAVE;

/**
 *	@brief	セーブデータブロックへのポインタを取得
 */
extern PGEAR_SAVE* SaveData_GetPGearSave(SAVEDATA* sv);

/**
 *	@brief	セーブデータブロックへのポインタを取得
 */
extern PMTEL_SAVE* SaveData_GetPMTelSave(SAVEDATA* sv);

/**
 *	@brief	ポケギアセーブデータサイズ取得
 */
extern int PGearSv_GetWorkSize(void);

/**
 *	@brief	ポケギアセーブデータクリア
 */
extern void PGearSv_Clear(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギアデータ　初期データ
 */
extern void PGearSv_Init(PGEAR_SAVE* sv);


/**
 *	@brief	マーカーブロックへのポインタを取得する
 */
extern MARKER_BLOCK* PGearSv_GetMarkerBlockP(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　モード取得
 */
extern PG_MODE_ID PGearSv_GetMode(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　モードセット
 */
extern void PGearSv_SetMode(PGEAR_SAVE* sv,PG_MODE_ID mode);

/**
 *	@brief	ポケギア　アプリオープンフラグセット
 */
extern void PGearSv_SetAppOpenFlag(PGEAR_SAVE* sv,PGAPP_OPEN_FLAG flag);

/**
 *	@brief	ポケギア　アプリオープンフラグ取得
 */
extern u8 PGearSv_GetAppOpenFlag(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　マップオープンレベルセット
 */
extern void PGearSv_SetMapOpenLevel(PGEAR_SAVE* sv,u8 level);

/**
 *	@brief	ポケギア　マップオープンフラグ取得
 */
extern u8 PGearSv_GetMapOpenLevel(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　スキンID取得
 */
extern PG_SKIN_ID PGearSv_GetSkin(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　スキンIDセット
 */
extern void PGearSv_SetSkin(PGEAR_SAVE* sv,PG_SKIN_ID skin);

/**
	@brief	ポケギア　スキン取得フラグセット
 */
extern void PGearSv_SetSkinFlag(PGEAR_SAVE* sv,PG_SKIN_ID id);
/**
 *	@brief	ポケギア　指定したIDのスキンが取得されているかどうか？
 */
extern BOOL PGearSv_GetSkinFlag(PGEAR_SAVE* sv,PG_SKIN_ID id);
/**
 *	@brief	ポケギア　スキンの取得フラグをまとめてu16型で取得
 */
extern u16	PGearSv_GetSkinFlagAll(PGEAR_SAVE* sv);

/**
	@brief	ポケギア　スキン取得フラグセット
 */
extern void PGearSv_SetNewSkinFlag(PGEAR_SAVE* sv,PG_SKIN_ID id,BOOL state);
/**
 *	@brief	ポケギア　指定したIDのスキンが取得されているかどうか？
 */
extern BOOL PGearSv_GetNewSkinFlag(PGEAR_SAVE* sv,PG_SKIN_ID id);
/**
 *	@brief	ポケギア　スキンの取得フラグをまとめてu16型で取得
 */
extern u16	PGearSv_GetNewSkinFlagAll(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　マップアフィン取得
 */
extern PG_MAPAFF_MODE PGearSv_GetMapAff(PGEAR_SAVE* sv);

/**
 *	@brief	ポケギア　マップアフィンモードセット
 */
extern void PGearSv_SetMapAff(PGEAR_SAVE* sv,PG_MAPAFF_MODE aff);

/**
 *	@brief	ポケギア　ラジオ選局カーソル位置セット
 */
extern void PGearSv_SetRadioChSelectPos(PGEAR_SAVE* sv,u8 x,u8 y);
/**
 *	@brief	ポケギア　ラジオ選局カーソル位置取得
 */
extern void PGearSv_GetRadioChSelectPos(PGEAR_SAVE* sv,s16* x,s16* y);

/**
 *	@brief	ポケギア　電話帳　登録数取得
 */
extern u8 PGearSv_GetTelBookEntryNum(PGEAR_SAVE* sv);

/*
 *	@brief	ポケギア　電話帳　重複登録チェック用
 *
 *	@retval PMTEL_NUMBER_NULL：未登録
 *	@retval そのた：登録済み(登録されているナンバー)
 */
extern PMTEL_NUMBER PGearSv_IsTelNumberEntry(PGEAR_SAVE* sv,PMTEL_NUMBER_ID id);

/**
 *	@brief	ポケギア　電話帳　新規登録
 */
extern void PGearSv_AddTelNumber(PGEAR_SAVE* sv,PMTEL_NUMBER_ID id);

/*
 *	@brief	ポケギア　電話帳　登録アドレスをまとめてAllocした
 *			PMTEL_NUMBER型(u8)のバッファに取得
 *
 *	＊内部でメモリをAllocするので、要らなくなったらsys_FreeMemoryEz()で解放すること！
 */
extern PMTEL_NUMBER* PGearSv_GetTelBook(PGEAR_SAVE* sv,int heapID);

/*
 *	@brief	ポケギア　電話帳　登録アドレスの並びを書換え
 *
 *	@param	src	PMTEL_NUMBER型の配列
 *	@param	num	書換え項目数
 */
extern void PGearSv_PutTelBook(PGEAR_SAVE* sv,PMTEL_NUMBER* src,u8 num);

/*
 *	@brief	全電話帳データをクリアする(おかあさんだけに戻す)
 */
extern void PGearSv_TelBookAllClear(PGEAR_SAVE* sv);

/**
 *	@brief	電話セーブデータポインタ取得
 */
extern PMTEL_SAVE* PGearSv_GetTelDataP(PGEAR_SAVE* sv);

/**
 *	@brief	着信予約　セット
 */
extern void PMTelSv_CallReserveSet(PMTEL_SAVE* ps,PMTEL_RESERVE_ID id);

/**
 *	@brief	着信予約　リセット
 */
extern void PMTelSv_CallReserveReset(PMTEL_SAVE* ps,PMTEL_RESERVE_ID id);

/**
 *	@brief	着信予約状態取得
 */
extern BOOL PMTelSv_CallReserveCheck(PMTEL_SAVE* ps,PMTEL_RESERVE_ID id);

/*
 *	@brief	再戦フラグセット/リセット
 */
extern void PMTelSv_RevengeFlagSet(PMTEL_SAVE* ps,PMTEL_NUMBER_ID id,BOOL set);

/*
 *	@brief	再戦フラグ取得
 */
extern BOOL PMTelSv_RevengeFlagGet(PMTEL_SAVE* ps,PMTEL_NUMBER_ID id);

/*
 *	@brief	アイテムイベントフラグセット/リセット
 */
extern void PMTelSv_ItemEvDataSet(PMTEL_SAVE* ps,PMTEL_NUMBER_ID id,u16 itemno);

/*
 *	@brief	アイテムイベントデータ取得
 *
 *	@return	イベント用にセットされたアイテムNo
 *
 *	＊ITEM_DUMMY_DATA が返されたらイベントが設定されていない
 */
extern u16 PMTelSv_ItemEvDataGet(PMTEL_SAVE* ps,PMTEL_NUMBER_ID id);

/**
 *	@brief	貯金金額操作
 *
 *	@param	command	(PMTEL_DEPOSIT_GET,PMTEL_DEPOSIT_SET,PMTEL_DEPOSIT_ADD,PMTEL_DEPOSIT_SUB)
 *
 *	@return	操作後の貯金金額
 */
extern u32 PMTelSv_DepositControl(PMTEL_SAVE* ps,PMTEL_DEPOSIT_COMMAND command,u32 param);

/**
 *	@brief	貯金アイテム購入済みフラグ操作
 */
extern void PMTelSv_PerchaseFinishFlagSet(PMTEL_SAVE* ps,u8 id);

/**
 *	@brief	貯金アイテム購入済みフラグ取得
 */
extern BOOL PMTelSv_PerchaseFinishFlagGet(PMTEL_SAVE* ps,u8 id);

/**
 *	@brief	貯金購入アイテムストック
 */
extern void PMTelSv_DepositItemStockAdd(PMTEL_SAVE* ps,u16 itemno,u16 num);

/**
 *	@brief	貯金購入アイテムストック削除(先頭から一つ削除)
 */
extern void PMTelSv_DepositItemStockDel(PMTEL_SAVE* ps);

/**
 *	@brief	貯金購入アイテムストック　パラメータ取得
 *
 *	@param	id	ストックID
 *	@param	itemno	アイテムナンバーを格納するバッファポインタ
 *
 *	@return	ストック数(ストック数が0なら無効データ)
 */
extern u16 PMTelSv_DepositItemStockGet(PMTEL_SAVE* ps,u8 id,u16* itemno);

/**
 *	@brief	ストック領域が満杯かどうか？
 */
extern BOOL PMTelSv_IsDepositItemStockFull(PMTEL_SAVE* ps);

/**
 *	@brief	タケノリフラグセット
 */
extern void PMTelSv_TakenoriFlagSet(PMTEL_SAVE* ps,BOOL set);

/**
 *	@brief	タケノリフラグゲット
 */
extern BOOL PMTelSv_TakenoriFlagGet(PMTEL_SAVE* ps);

/**
 *	@brief	タケノリカウンターを返す
 */
extern u8 PMTelSv_GetTakenoriCounter(PMTEL_SAVE* ps);

/**
 *	@brief	タケノリカウンターをセット
 */
extern void PMTelSv_SetTakenoriCounter(PMTEL_SAVE* ps,u8 counter);

/*
 *	@brierf	タケノリカウンターをコントール(日付更新イベントで一日一回だけ呼ぶ)
 */
extern void PMTelSv_TakenoriCounterControl(PMTEL_SAVE* ps,s32 diff_days);

/**
 *	@brief	サファリエンカウント率更新履歴保存
 */
extern void PMTelSv_SafariUpdateHistorySet(PMTEL_SAVE* ps,u8* history,u8 num);

/*
 *	@brief	サファリエンカウント率更新履歴取得
 *
 *	@param	num	履歴数を取得するためのu8型変数へのポインタ
 *	@param	heapID	バッファ取得に使用するヒープ
 *
 *	u8型のバッファにエンカウント率更新履歴をAllocして取得します
 *	呼び出し側が解放すること
 */
extern u8* PMTelSv_SafariUpdateHistoryGetAlloc(PMTEL_SAVE* ps,u8* num,int heapID);

#endif	//__H_PGEAR_SV_UTIL_H__


